const { app, BrowserWindow, ipcMain } = require('electron')
const { autoUpdater} = require('electron-updater')
const os = require('os')
const logger = require('electron-log')

//打印log到本地
logger.transports.file.maxSize = 1002430 // 10M
logger.transports.file.format =
  '[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}]{scope} {text}'
logger.transports.file.resolvePathFn = () => './operation.log' //打印在你安装的软件位置，

autoUpdater.autoDownload = false //这个必须写成false，写成true时，我这会报没权限更新，也没清楚什么原因

// 将创建窗口独立成一个函数
function createWindow() {
  let mainWin = new BrowserWindow({
    x: 100,
    y: 100, // 设置窗口显示的位置，相对于当前屏幕的左上角
    show: false, // 默认情况下创建一个窗口对象之后就会显示，设置为false 就不会显示了
    width: 1200,
    height: 800,
    //  maxHeight: 600,
    //  maxWidth: 1000,
    minHeight: 200,
    minWidth: 300, // 可以通过 min max 来设置当前应用窗口的最大和最小尺寸

    frame: true, // 是否显示窗口的边框


    resizable: true, // 是否允许缩放应用的窗口大小
    title: 'electron-tester',
    webPreferences: {
      enableWebSQL: false,
      webSecurity: false,
      spellcheck: false,
      nativeWindowOpen: true,
      nodeIntegration: true,
      contextIsolation: false,
    },
    experimentalDarkMode: true,
  })

  mainWin.loadFile('index.html')
  //mainWin.loadFile('./Test/test.html')
  mainWin.center(); // 将窗口显示在屏幕中心
  mainWin.on('ready-to-show', () => {
    mainWin.show()
  })
  // mainWin.on('closed', () => {
  //   console.log('mainWin is closed')
  //   mainWin = null
  // })


  //忽略无关代码
  ipcMain.on('checkUpdate', () => {
    console.log('checkUpdate-->')
    //处理更新操作
    const returnData = {
      error: {
        status: -1,
        msg: '更新时发生意外，无法进行正常更新！或者请检查服务地址是否有添加扩展名为 .yml 的 MIEI 类型（text/yml）',
      },
      checking: {
        status: 0,
        msg: '正在检查更新……',
      },
      updateAva: {
        status: 1,
        msg: '正在升级……',
      },
      updateNotAva: {
        status: 2,
        msg: '当前没有可用的更新...',
      },
    }

    let platform =
      os.platform() === 'darwin'
        ? process.arch === 'x64'
          ? 'darwin'
          : 'darwin-arm64'
        : 'win32'
    let commitId = 'ab4f3c131bfec65670dd265549646b725f8ee649'

    //更新连接
    autoUpdater.setFeedURL(
      // `https://devxz.dafenqi.law/lawdawn-api/api/update/${platform}/${commitId}`
      'http://localhost:55322/'
    )
    logger.error(['检查更新'])
    //更新错误事件
    autoUpdater.on('error', function (error) {
      console.log('err-->', error)
      logger.error(['检查更新失败', error])
      sendUpdateMessage(returnData.error)
    })

    //检查事件
    autoUpdater.on('checking-for-update', function () {
      sendUpdateMessage(returnData.checking)
    })

    //发现新版本
    autoUpdater.on('update-available', function (info) {
      console.log('info22-->', info)
      logger.info(['发现新版本', info])
      sendUpdateMessage(returnData.updateAva)
      autoUpdater.downloadUpdate()
    })

    //当前版本为最新版本
    autoUpdater.on('update-not-available', function (info) {
      console.log('info11-->', info)
      setTimeout(function () {
        sendUpdateMessage(returnData.updateNotAva)
      }, 1000)
    })

    //更新下载进度事件
    autoUpdater.on(
      'download-progress',
      function (progressObj, bytesPerSecond, percent, total, transferred) {
        console.log('progressObj-->', progressObj)
        mainWin.webContents.send('downloadProgress', progressObj)
      }
    )

    //下载完毕
    autoUpdater.on('update-downloaded', function (event, releaseObj) {
      //退出并进行安装（这里可以做成让用户确认后再调用）
      console.log('releaseNotes-->', releaseObj)
      autoUpdater.quitAndInstall()
    })

    //发送消息给窗口
    function sendUpdateMessage(text) {
      mainWin.webContents.send('message', text)
    }

    //发送请求更新
    autoUpdater.checkForUpdates()
  })

  ipcMain.on('getIpAddress', () => {
    var ip = getIPAddress();
    mainWin.webContents.send('ipAddress', ip);
  })
  
  ipcMain.on('getMacAddress', () => {
    var mac = getMacAddress();
    mainWin.webContents.send('macAddress', mac);
  })

 
}


process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'

console.log('Current System:', process.platform);//读取当前操作系统
console.log('Current working directory:' +process.cwd());//当前工作目录

//当Electron完成初始化并准备创建浏览器窗口时，将调用此方法。有些api只能在此事件发生后使用。
app.whenReady().then(() => {
  //在macos上，当点击dock图标而没有打开其他窗口时，在应用程序中重新创建一个窗口是很常见的。
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
})


app.on('window-all-closed', () => {
  
  console.log('all window is closed')
  app.quit()
})



/** 获取ip地址
 * @returns 返回当前系统的IP地址
 */
const getIPAddress = () => {
  const interfaces = os.networkInterfaces();
  for (const name of Object.keys(interfaces)) {
    const interface1 = interfaces[name];
    for (const net of interface1) {
      if (net.family === 'IPv4' && net.address !== '127.0.0.1') {
        console.log('app IP Address:'+ net.address);
        return net.address;
      }
    }
  }
  return '127.0.0.1';
};

/** 获取ip地址
 * @returns 返回当前系统的MAC地址
 */
const getMacAddress = () => {
  const interfaces = os.networkInterfaces();
  for (const name of Object.keys(interfaces)) {
    const interface1 = interfaces[name];
    for (const net of interface1) {
      if (net.mac) {
        console.log('app MAC Address:'+ net.mac);
        return net.mac;
      }
    }
  }
  return '00:00:00:00:00:00';
};